"""
 * EJERCICIO:
 * Explora el concepto de manejo de excepciones según tu lenguaje.
 * Fuerza un error en tu código, captura el error, imprime dicho error
 * y evita que el programa se detenga de manera inesperada.
 * Prueba a dividir "10/0" o acceder a un índice no existente
 * de un listado para intentar provocar un error.
 *
 * DIFICULTAD EXTRA (opcional):
 * Crea una función que sea capaz de procesar parámetros, pero que también
 * pueda lanzar 3 tipos diferentes de excepciones (una de ellas tiene que
 * corresponderse con un tipo de excepción creada por nosotros de manera
 * personalizada, y debe ser lanzada de manera manual) en caso de error.
 * - Captura todas las excepciones desde el lugar donde llamas a la función.
 * - Imprime el tipo de error.
 * - Imprime si no se ha producido ningún error.
 * - Imprime que la ejecución ha finalizado. 
"""

from typing import Iterable, final


months = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
]

try:
    my_result = 10 / 0  # ZeroDivisionError
    my_item = months[12]  # IndexError
except Exception as error:
    print(f"{type(error).__name__}: {error}")


"""
 * DIFICULTAD EXTRA (opcional):
 * Crea una función que sea capaz de procesar parámetros, pero que también
 * pueda lanzar 3 tipos diferentes de excepciones (una de ellas tiene que
 * corresponderse con un tipo de excepción creada por nosotros de manera
 * personalizada, y debe ser lanzada de manera manual) en caso de error.
 * - Captura todas las excepciones desde el lugar donde llamas a la función.
 * - Imprime el tipo de error.
 * - Imprime si no se ha producido ningún error.
 * - Imprime que la ejecución ha finalizado. 
"""


class UnknownTypeError(Exception):
    pass


def process_params(*args):
    for arg in args:
        if type(arg) == bool:
            raise UnknownTypeError("I don't know what a bool is..")
        if type(arg) == int:
            arg /= 0
        if type(arg) == list:
            print(arg[len(arg)])

        print(arg)


try:
    process_params(1, True, "false", [1, 2, 3])
except UnknownTypeError as e:
    print(f"{type(e).__name__}: {e}")
except ZeroDivisionError:
    print("You can't divide by zero!")
except IndexError:
    print("The list is smaller than the index used.")
else:
    print("No error has been raised.")
finally:
    print("The program has finished.")
